Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/backend/rnode_support.py db806684bcfb8686e2b276c3f6d466a3dc1f3ebb (db806684) Text, 5.07 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""RNode USB serial / BLE UART support checks for desktop and Android."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787logging

Te6edf3logger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)


Tff7b72def Td2a8ff_is_chaquopy_androidTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787android_push_bridge Tff7b72import Te6edf3_is_chaquopy_android Tff7b72as Te6edf3_check

Tff7b72return Te6edf3_checkTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72return Tff7b72False


Tff7b72def Td2a8ffandroid_usbserial4a_availableTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""True when Chaquopy can import usbserial4a (RNS RNode on Android)."""
Tff7b72if Tff7b72not Te6edf3_is_chaquopy_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787usbserial4a T8b949e# noqa: F401
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True


Tff7b72def Td2a8ffdesktop_serial_stack_availableTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787serialT7ee787.T7ee787tools Tff7b72import Te6edf3list_ports T8b949e# noqa: F401
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True


Tff7b72def Td2a8ffrnode_serial_supportedTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Whether RNode serial and ble:// UART ports can be opened on this platform."""
Tff7b72if Te6edf3_is_chaquopy_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3android_usbserial4a_availableTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3desktop_serial_stack_availableTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8ffdisable_rnode_interfaces_in_configTb4b4b4(Te6edf3config_pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Disable enabled RNode* interfaces in a Reticulum config file.

Returns True if any interfaces were disabled.
"""
Tff7b72import T7ee787os

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj

Te6edf3cfg Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3config_pathTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72False

Te6edf3modified Tff7b72= Tff7b72False
Te6edf3interfaces Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3interfacesTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72for Te6edf3_iface_nameTb4b4b4, Te6edf3iface Tff7b72in Te6edf3interfacesTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3ifaceTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3iface_type Tff7b72= Te6edf3ifaceTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3iface_typeTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3iface_typeTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffRNodeTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657strTb4b4b4(Te6edf3ifaceTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinterface_enabledTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4(
Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffonTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3ifaceTb4b4b4[Ta5d6ff"Ta5d6ffinterface_enabledTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6fffalseTa5d6ff"
Te6edf3modified Tff7b72= Tff7b72True
Tff7b72if Te6edf3modifiedTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3cfgTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return Te6edf3modified


Tff7b72def Td2a8ff_rnode_interface_has_invalid_txpowerTb4b4b4(Te6edf3ifaceTb4b4b4: Tffa657dictTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787interface_editor Tff7b72import Te6edf3validate_rnode_txpower

Te6edf3iface_type Tff7b72= Te6edf3ifaceTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3iface_typeTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Te6edf3iface_type Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffRNodeIPInterfaceTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3validate_rnode_txpowerTb4b4b4(Te6edf3ifaceTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72is Tff7b72not Tff7b72None
Tff7b72if Te6edf3iface_type Tff7b72== Ta5d6ff"Ta5d6ffRNodeMultiInterfaceTa5d6ff"Tb4b4b4:
Tff7b72for Te6edf3value Tff7b72in Te6edf3ifaceTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tffa657dictTb4b4b4) Tff7b72and Ta5d6ff"Ta5d6fftxpowerTa5d6ff" Tff7b72in Te6edf3valueTb4b4b4:
Tff7b72if Te6edf3validate_rnode_txpowerTb4b4b4(Te6edf3valueTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False


Tff7b72def Td2a8ffguard_invalid_rnode_txpower_in_configTb4b4b4(Te6edf3config_pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Disable RNode interfaces whose TX power would crash Reticulum on startup."""
Tff7b72import T7ee787os

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787interface_editor Tff7b72import Te6edf3validate_rnode_txpower

Te6edf3cfg Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3config_pathTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72False

Te6edf3modified Tff7b72= Tff7b72False
Te6edf3interfaces Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3interfacesTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72for Te6edf3iface_nameTb4b4b4, Te6edf3iface Tff7b72in Te6edf3interfacesTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3ifaceTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72if Tff7b72not Te6edf3_rnode_interface_has_invalid_txpowerTb4b4b4(Te6edf3ifaceTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72if Tffa657strTb4b4b4(Te6edf3ifaceTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinterface_enabledTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72not Tff7b72in Tb4b4b4(
Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffonTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3ifaceTb4b4b4[Ta5d6ff"Ta5d6ffinterface_enabledTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6fffalseTa5d6ff"
Te6edf3modified Tff7b72= Tff7b72True
Te6edf3txpower Tff7b72= Te6edf3ifaceTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3txpower Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3value Tff7b72in Te6edf3ifaceTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tffa657dictTb4b4b4) Tff7b72and Ta5d6ff"Ta5d6fftxpowerTa5d6ff" Tff7b72in Te6edf3valueTb4b4b4:
Te6edf3txpower Tff7b72= Te6edf3valueTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4)
Tff7b72break
Te6edf3detail Tff7b72= Te6edf3validate_rnode_txpowerTb4b4b4(Te6edf3txpowerTb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ffinvalid TX powerTa5d6ff"
Te6edf3loggerTff7b72.Td2a8ffwarningTb4b4b4(
Ta5d6ff'Ta5d6ffDisabled RNode interface Ta5d6ff"Tffd700%sTa5d6ff"Ta5d6ff before startup: Tffd700%sTa5d6ff'Tb4b4b4,
Te6edf3iface_nameTb4b4b4,
Te6edf3detailTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3modifiedTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3cfgTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return Te6edf3modified


Tff7b72def Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Te6edf3config_pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""On Android without usbserial4a, disable RNode interfaces to avoid startup crashes."""
Tff7b72if Tff7b72not Te6edf3_is_chaquopy_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Te6edf3rnode_serial_supportedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Te6edf3disabled Tff7b72= Te6edf3disable_rnode_interfaces_in_configTb4b4b4(Te6edf3config_pathTb4b4b4)
Tff7b72if Te6edf3disabledTb4b4b4:
Te6edf3loggerTff7b72.Td2a8ffwarningTb4b4b4(
Ta5d6ff"Ta5d6ffRNode interfaces were disabled because usbserial4a is not installed. Ta5d6ff"
Ta5d6ff"Ta5d6ffRebuild the Android app with usbserial4a or remove RNode entries from config.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3disabled


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────